package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class Handler implements InvocationHandler {

    /**
     * 但是InvocationHandler实现类最好保存一个目标对象引用
     * 否则通过代理对象调用目标对象的方法时无法知道原始对象
     * 或者会反复调用代理对象的方法，一直进入invoke导致栈溢出
     */
    private Object target;

    public Handler(Object target) {
        this.target = target;
    }

    /**
     * 在调用代理对象时会先执行invoke方法
     * 再通过invoke方法执行原始对象的对应方法
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理哦");
        Object invoke = method.invoke(target, args);
        System.out.println("代理结束");
        return invoke;
    }
}
